package com.zyl.add;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

/**
 * @author zhaoyl
 * @date 2024/5/16 10:22
 * @description 说明
 * CyclicBarrier 字面意思回环栅栏（循环屏障），通过它可以实现让一组线程等待至某个状态（屏障点）之后再全部同时执行。
 * 叫做回环是因为当所有等待线程都被释放以后，CyclicBarrier可以被重用。
 * CyclicBarrier 作用是让一组线程相互等待，当达到一个共同点时，所有之前等待的线程再继续执行，
 * 且 CyclicBarrier 功能可重复使用。
 */
public class CyclicBarrierDemo {

    private static int SIZE = 5;
    private static CyclicBarrier cb;

    public static void main(String[] args) {
      //CyclicBarrier(int parties)：表示创建一个新的 CyclicBarrier，它将在给定数量的参与者（线程）处于等待状态时启动，但它不会在启动 barrier 时执行预定义的操作。
        cb = new CyclicBarrier(SIZE,()->{
            System.out.println("所有线程写入完毕");
        });
        //开启5个线程
        for (int i = 0; i < SIZE; i++) {
            final int temp = i;
            new Thread(()->{
                System.out.println(Thread.currentThread().getName()+"->"+temp+"-正在执行同一个任务");
                // 以睡眠来模拟几个线程执行一个任务的时间
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("线程" + Thread.currentThread().getName() + "执行任务完成，等待其他线程执行完毕");

                try {
                    // 用来挂起当前线程，直至所有线程(SIZE=5)都到达barrier状态再同时执行后续任务；(如果达不到数量会一直阻塞)
                    cb.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
            },"线程"+temp).start();
        }
    }



}
